package com.infinit.selfhelp.common.ext

import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

fun LifecycleOwner.launchInScope(
    block: suspend CoroutineScope.() -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        // 执行传入的代码块
        block.invoke(this)
    }
}
fun Fragment.launchInScope(
    block: suspend CoroutineScope.() -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        // 执行传入的代码块
        block.invoke(this)
    }
}
fun AppCompatActivity.launchInScope(
    block: suspend CoroutineScope.() -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        // 执行传入的代码块
        block.invoke(this)
    }
}

suspend fun <T> onMainThread(block: suspend () -> T): T =
    withContext(Dispatchers.Main) { block() }

suspend fun <T> onDefaultThread(block: suspend () -> T): T =
    withContext(Dispatchers.Default) { block() }

suspend fun <T> onIOThread(block: suspend () -> T): T =
    withContext(Dispatchers.IO) { block() }

// 定义一个扩展函数，可以选择在主线程或默认线程执行代码块
fun LifecycleOwner.launchOnScope(
    onMainThread: Boolean = true,
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        if (onMainThread) {
            // 在主线程中执行代码块
            withContext(Dispatchers.Main) { block() }
        } else {
            // 在默认线程中执行代码块
            withContext(Dispatchers.Default) { block() }
        }
    }
}

fun Fragment.launchOnScope(
    onMainThread: Boolean = true,
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        if (onMainThread) {
            // 在主线程中执行代码块
            withContext(Dispatchers.Main) { block() }
        } else {
            // 在默认线程中执行代码块
            withContext(Dispatchers.Default) { block() }
        }
    }
}

fun LifecycleOwner.onUI(
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        withContext(Dispatchers.Main) { block() }
    }
}
fun Fragment.onUI(
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        withContext(Dispatchers.Main) { block() }
    }
}


fun AppCompatActivity.onUI(
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        withContext(Dispatchers.Main) { block() }
    }
}

fun AppCompatActivity.launchInMain(
    onMainThread: Boolean = true,
    block: suspend () -> Unit
) {
    // 在视图生命周期范围内启动协程
    lifecycleScope.launch {
        if (onMainThread) {
            // 在主线程中执行代码块
            withContext(Dispatchers.Main) { block() }
        } else {
            // 在默认线程中执行代码块
            withContext(Dispatchers.Default) { block() }
        }
    }
}